let wsurl = "";
let accessToken = "";
let messageCallBack = null;
let closeCallBack = null;
let connectCallBack = null;
let isConnect = false; //连接标识 避免重复连接
let rec = null;
let isInit = false;

let init = () => {
  // 防止重复初始化
  if (isInit) {
    return;
  }
  isInit = true;
  uni.onSocketOpen((res) => {
    console.log("WebSocket连接已打开");
    isConnect = true;
    // 发送登录命令
    let loginInfo = {
      cmd: 0,
      data: {
        accessToken: accessToken,
      },
    };
    uni.sendSocketMessage({
      data: JSON.stringify(loginInfo),
    });
  });

  uni.onSocketMessage((res) => {
    let sendInfo = JSON.parse(res.data);
    if (sendInfo.cmd == 0) {
      heartCheck.start();
      connectCallBack && connectCallBack();
      console.log("WebSocket登录成功");
    } else if (sendInfo.cmd == 1) {
      // 重新开启心跳定时
      heartCheck.reset();
    } else {
      // 其他消息转发出去
      console.log("接收到消息", sendInfo);
      messageCallBack && messageCallBack(sendInfo.cmd, sendInfo.data);
    }
  });

  uni.onSocketClose((res) => {
    console.log("WebSocket连接关闭");
    isConnect = false;
    closeCallBack && closeCallBack(res);
  });

  uni.onSocketError((e) => {
    console.log(e);
    isConnect = false;
    // APP 应用切出超过一定时间(约1分钟)会触发报错，此处回调给应用进行重连
    closeCallBack && closeCallBack({ code: 1006 });
  });
};

let connect = (url, token) => {
  wsurl = url;
  accessToken = token;
  if (isConnect) {
    return;
  }
  uni.connectSocket({
    url: wsurl,
    success: (res) => {
      console.log("websocket连接成功");
    },
    fail: (e) => {
      console.log(e);
      console.log("websocket连接失败，10s后重连");
      setTimeout(() => {
        connect();
      }, 10000);
    },
  });
};

//定义重连函数
let reconnect = (wsurl, accessToken) => {
  console.log("尝试重新连接");
  if (isConnect) {
    //如果已经连上就不在重连了
    return;
  }
  rec && clearTimeout(rec);
  rec = setTimeout(function () {
    // 延迟15秒重连  避免过多次过频繁请求重连
    connect(wsurl, accessToken);
  }, 15000);
};

//设置关闭连接
let close = (code) => {
  if (!isConnect) {
    return;
  }
  uni.closeSocket({
    code: code,
    complete: (res) => {
      console.log("关闭websocket连接");
      isConnect = false;
    },
    fail: (e) => {
      console.log("关闭websocket连接失败", e);
    },
  });
};

//心跳设置
var heartCheck = {
  timeout: 10000, //每段时间发送一次心跳包 这里设置为30s
  timeoutObj: null, //延时发送消息对象（启动心跳新建这个对象，收到消息后重置对象）
  start: function () {
    if (isConnect) {
      console.log("发送WebSocket心跳");
      let heartBeat = {
        cmd: 1,
        data: {},
      };
      uni.sendSocketMessage({
        data: JSON.stringify(heartBeat),
        fail(res) {
          console.log(res);
        },
      });
    }
  },
  reset: function () {
    clearTimeout(this.timeoutObj);
    this.timeoutObj = setTimeout(function () {
      heartCheck.start();
    }, this.timeout);
  },
};

// 实际调用的方法
function sendMessage(agentData) {
  uni.sendSocketMessage({
    data: agentData,
  });
}

let onConnect = (callback) => {
  connectCallBack = callback;
};

function onMessage(callback) {
  messageCallBack = callback;
}

function onClose(callback) {
  closeCallBack = callback;
}

// 将方法暴露出去
export {
  init,
  connect,
  reconnect,
  close,
  sendMessage,
  onConnect,
  onMessage,
  onClose,
};
